iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
1
Security

資安0~100K只要30天系列 第 10

Day 10 - PHP 黑魔法 (一)

  • 分享至 

  • xImage
  •  

PHP 是世界上最好的語言

一張圖片勝過千言萬語
連日本知名女明星都這麼說了
你還想反駁嗎

如果現在不能理解也沒關係
繼續看繼續學只會越來越香

PHP 是什麼

  • 弱型別語言(通常跟這名詞扯上關係的語言各種意義上都很方便
  • 動態語言
  • 高度擴充性

作為一個後端語言 PHP 的存在已經非常有歷史
算是一個非常完善的語言了
不但官方提供與許多其他服務做連接的套件
社群套件也非常豐富

那為什麼說是黑魔法呢
因為 PHP 作為一個後端語言
是不能隨意因為語法小錯誤而停止運作的
因此衍生出一種非常高的容錯機制
告訴你語法不允許卻還是讓你執行
然後丟個例外處理之類的行為

黑魔法

弱型別比較

剛剛有說到 PHP 是一種弱型別語言
這是什麼意思呢

一般來說程式語言中的比較都是 ==
用來回傳兩個項目是否相等
但在弱型別語言中有 ===== 的差別

  • ==
    • 只比較記憶體中的值
  • ===
    • 除了值相同以外,還要形態相同

可以看看這張表
綠色的部分是預期要的行為
但其他黃色的部分明明看似不同卻能成立
紅色更不用說了 根本獵奇

MD5 驗證繞過

我們立刻就來看個例子吧

if($a != $b && md5($a) == md5($b))
{
    echo 'T';
}

在這個例子中如果 $a 一定跟 $b 不一樣的話
兩個出來的 md5 有可能相等嗎
這當然是有可能的
只是在密碼學的領域叫做碰撞
要找到一個這樣的值是機率非常低的
但從上面的語法卻不需要透過碰撞的方式就可以成立

舉以下字串來說

  • QNKCDZO
    • md5 = 0e830400451993494058024219903391
  • 240610708
    • md5 = 0e462097431906509019562988736854
  • s878926199a
    • md5 = 0e545993274517709034328855841020
  • s155964671a
    • md5 = 0e342768416822451524974117254469
  • s214587387a
    • md5 = 0e848240448830537924465865611904

他們 md5 出來都後都是 0e 開頭
且是使用兩個等於的弱比較
那在比較的時候這些 0e 開頭的字串會被轉型成 int 型態
所以 0e 開頭的 int 意思是 0 的 xxx 次方
比如 0e830400451993494058024219903391 就是 0 的 830400451993494058024219903391 次方
那 0 的不管幾次方都是 0
就造成了上面的弱等於會回傳 true 了

在這邊
明明兩個完全不同的字串出來的 md5 也完全不相同
最後卻過了這項驗證被認為是相等
因此兩個等於的寫法是非常危險的


上一篇
Day 09 - Web 狗新手駕照
下一篇
Day 11 - PHP 黑魔法 (二)
系列文
資安0~100K只要30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言